package com.xmqsfsky1017.skysrf.utils;

import android.content.Context;
import android.content.res.AssetManager;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.function.Consumer;

public class FileHelper {
    private File file;

    /**
     * 构造方法：初始化文件路径
     * @param path 文件绝对路径或相对路径
     */
    public FileHelper(String path) {
        this.file = new File(path);
    }

    /**
     * 读取当前文件内容
     * @return 文件内容字符串（包含换行）
     * @throws IOException 文件不存在或读取失败时抛出
     */
    public String read() throws IOException {
        if (!file.exists()) {
            throw new IOException("File not found: " + file.getAbsolutePath());
        }
        StringBuilder sb = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }
        }
        return sb.toString();
    }

    /**
     * 追加内容到文件（文件/目录不存在时自动创建）
     * @param content 待追加的内容
     * @throws IOException 写入失败时抛出
     */
    public void append(String content) throws IOException {
        createParentDirIfNeeded();
        try (FileWriter fw = new FileWriter(file, true)) {
            fw.write(content);
        }
    }

    /**
     * 覆盖写入内容到文件（文件/目录不存在时自动创建）
     * @param content 待写入的内容
     * @throws IOException 写入失败时抛出
     */
    public void write(String content) throws IOException {
        createParentDirIfNeeded();
        try (FileWriter fw = new FileWriter(file)) {
            fw.write(content);
        }
    }

    /**
     * 检查文件是否存在
     * @return 存在返回true，否则false
     */
    public boolean exists() {
        return file.exists();
    }

    /**
     * 删除当前文件
     * @return 删除成功返回true，否则false
     */
    public boolean delete() {
        return file.exists() && file.delete();
    }

    /**
     * 获取文件扩展名（不含"."）
     * @return 扩展名字符串（如"txt"），无扩展名则返回空字符串
     */
    public String getExtension() {
        String name = file.getName();
        int dotIndex = name.lastIndexOf('.');
        return (dotIndex == -1) ? "" : name.substring(dotIndex + 1);
    }

    /**
     * 读取assets目录下的文件内容
     * @param context 安卓上下文（如Activity、Application）
     * @param assetPath assets内相对路径（例："config.txt"或"dir/file.json"）
     * @return 文件内容字符串（包含换行）
     * @throws IOException 文件不存在或读取失败时抛出
     */
    public static String readFromAssets(Context context, String assetPath) throws IOException {
        StringBuilder content = new StringBuilder();
        try (InputStream is = context.getAssets().open(assetPath);
             BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
            String line;
            while ((line = br.readLine()) != null) {
                content.append(line).append("\n");
            }
        }
        return content.toString();
    }
	
    /**
     * 简化文件操作的链式调用（类似Python的with语法）
     * @param path 文件路径
     * @param todo 对FileHelper的操作逻辑
     */
    public static void with(String path, Consumer<FileHelper> todo) {
        todo.accept(new FileHelper(path));
    }

    // 确保父目录存在，避免写入失败
    private void createParentDirIfNeeded() {
        File parentDir = file.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            parentDir.mkdirs();
        }
    }
}